package ar.pmt.modelo.beans;

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;


/**
 * @author gburgener
 * Bean de Modelo Proyecto
 *
 */
@Entity
@Table(name = "PROYECTOS")
public class Proyecto extends PersistenceObject {
	
	/**
	 * Nombre del proyecto
	 */
	private String nombre;
	
	/**
	 * Tecnologias asociadas al proyecto
	 */
	@ManyToMany
	@Cascade({CascadeType.MERGE })
	@LazyCollection(LazyCollectionOption.TRUE)
	private Collection<Tecnologia> tecnologias = new ArrayList<Tecnologia>();
	
	/**
	 * Peticiones asociadas al proyecto
	 */
	@OneToMany
	@JoinColumn(name = "idproyecto", nullable=false)
	@Cascade({CascadeType.DELETE_ORPHAN })
	@LazyCollection(LazyCollectionOption.TRUE)
	private Collection<Peticion> peticiones;
	
	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}
	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	/**
	 * @return the tecnologias
	 */
	public Collection<Tecnologia> getTecnologias() {
		return tecnologias;
	}
	/**
	 * @param tecnologias the tecnologias to set
	 */
	public void setTecnologias(Collection<Tecnologia> tecnologias) {
		this.tecnologias = tecnologias;
	}
	/**
	 * @return the peticiones
	 */
	public Collection<Peticion> getPeticiones() {
		return peticiones;
	}
	/**
	 * @param peticiones the peticiones to set
	 */
	public void setPeticiones(Collection<Peticion> peticiones) {
		this.peticiones = peticiones;
	}
	
	/**
	 * Metodo para agregar una peticion al proyecto
	 * @param peticion Peticion a agregar
	 * @throws Exception manejada por aspecto
	 */
	public void agregarPeticion(Peticion peticion) throws Exception{
		this.peticiones.add(peticion);
	}
	
	/**
	 * Metodo para eliminar una peticion del proyecto
	 * @param peticion Peticion a eliminar
	 * @throws Exception manejada por aspecto
	 * @param peticion
	 */
	public void eliminarPeticion(Peticion peticion) throws Exception{
		this.peticiones.remove(peticion);
	}
	
	/**
	 * Metodo para agregar una Tecnologia al proyecto
	 * @param tecno Tecnologia a agregar
	 * @throws Exception manejada por aspecto
	 */
	public void agregarTecnologia(Tecnologia tecno) throws Exception{
		this.tecnologias.add(tecno);
	}
	
	/**
	 * Metodo para eliminar una Tecnologia del proyecto
	 * @param tecno Tecnologia a eliminar
	 * @throws Exception manejada por aspecto
	 */
	public void eliminarTecnologia(Tecnologia tecno) throws Exception{
		this.tecnologias.remove(tecno);
	}
}
